/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package nfe;

import bd.ConBdSqlS;
import bd.Dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.List;
import util.Util;

/**
 *
 * @author camilo
 */
public class NfeDao implements Dao {

  protected Connection con;

  public NfeDao() throws SQLException {
    this.con = ConBdSqlS.getConexao();
  }

  /**
   *
   * @param nfe
   * @throws SQLException
   */
  public void adicionar(Nfe nfe) throws SQLException {
    NumberFormat nfs = new DecimalFormat("000");
    NumberFormat nfen = new DecimalFormat("000000");
    NumberFormat nfnd = new DecimalFormat("000000000");
//    Código SQL
    String sql = "INSERT INTO notafiscal(ID, Tipo, Documento, Serie, Entidade, NumeroDocumento, CFOP, "
            + "DataEmissao, DataEntrada, BaseICMS, ValorICMS, BaseICMSsub, ValorICMSsub,ValorFrete, "
            + "ValorSeguro, ValorOutras, ValorIPI, ValorProdutos, ValorNota, Status, "
            + "Observacao, OperadorCadastro, DataCadastro, ValorDesconto, NumeroExtorno, CodLancamento,"
            + "TipoTransportador, Transportador, FormaPagamento, Caixa, EndEntidade) "
            + "VALUES (?, '1', ?, ?, ?, ?, '5102', "
            + "?, ?, ?, ?, ?, ?, ?, "
            + "?, ?, ?, ?, ?, '0', "
            + "?, '4', ?, ?, '0', '0', '2', '-1', '1', '31122012', '0');";
    PreparedStatement stmt = con.prepareStatement(sql);

    //    Captura os valores dos atributos dos objetos e seta os parâmetros SQL
    stmt.setString(1, nfe.getID().toString()); // id
    stmt.setString(2, nfe.getDocumento()); // documento
    String serie = nfs.format(Double.parseDouble(nfe.getSerie()));
    stmt.setString(3, serie); // serie

    String ent = nfen.format(Double.parseDouble(nfe.getEntidade()));
    stmt.setString(4, ent); // entidade

    String nd = nfnd.format(Double.parseDouble(nfe.getNumeroDocumento().toString()));
    stmt.setString(5, nd); // numero documento

    stmt.setString(6, new Util().formatData(nfe.getDataEmissao())); // data emissao nfe.getDataEmissao().toString()
    stmt.setString(7, new Util().formatData(nfe.getDataEntrada())); // data entrada nfe.getDataEntrada().toString()
    stmt.setString(8, nfe.getBaseICMS().toString()); // base icms
    stmt.setString(9, nfe.getValorICMS().toString()); // valor icms
    stmt.setString(10, nfe.getBaseICMSsub().toString()); // base icms sub
    stmt.setString(11, nfe.getValorICMSsub().toString()); // valor icms sub
    stmt.setString(12, nfe.getValorFrete().toString()); // valor frete
    stmt.setString(13, nfe.getValorSeguro().toString()); // valor seguro
    stmt.setString(14, nfe.getValorOutras().toString()); // valor outras
    stmt.setString(15, nfe.getValorIPI().toString()); // valor ipi
    stmt.setString(16, nfe.getValorProdutos().toString()); // valor produtos
    stmt.setString(17, nfe.getValorNota().toString()); // valor nota
    stmt.setString(18, nfe.getObservacao()); // observacao
    stmt.setString(19, new Util().formatData(nfe.getDataCadastro())); // data cadastro nfe.getDataCadastro().toString()
    stmt.setString(20, nfe.getValorDesconto().toString()); // valor desconto
    //    Executa o código SQL
    stmt.execute();
//    Fecha a conexão
    stmt.close();
  }

  /**
   * Retorna o número da nota fiscal caso o registro exista no banco de dados. <br/>
   * Método para descobrir se a nota fiscal já está cadastrada.
   * @param numNf
   * @param forn
   * @return
   * @throws SQLException
   */
  public Nfe getNumNfe(String numNf, String forn) throws SQLException {
    Nfe n = new Nfe();//instancia um novo objeto
    //    Código SQL
    String sql = "SELECT numerodocumento, entidade, dataemissao "
            + "FROM notafiscal "
            + "WHERE (numerodocumento LIKE ?) AND (entidade LIKE ?)"
            + "ORDER BY id desc;";

    PreparedStatement stmt = this.con.prepareStatement(sql);
    stmt.setString(1, "%" + numNf);//Define o critério da consulta
    stmt.setString(2, "%" + forn);
    ResultSet rs = stmt.executeQuery();//executa a consulta SQL
//    percorre os registros da tabela e seta os valores das classes
    while (rs.next()) {
      n.setNumeroDocumento(rs.getDouble("numerodocumento"));
      n.setEntidade(rs.getString("entidade"));
      n.setDataEmissao(rs.getDate("dataemissao"));
    }
//    fecha as conexões
    rs.close();
    stmt.close();
    /**
     * retorna o objeto Nfe com as informações extraídas do banco de dados
     */
    return n;
  }

  @Override
  public List<Object> getLista(String param) throws SQLException {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public void altera(Object c1) throws SQLException {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public void remove(Object c1) throws SQLException {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public void adicionar(Class pme) throws SQLException {
    throw new UnsupportedOperationException("Not supported yet.");
//    stmt.setString(1,getClass().getMethod("getID", null).toString());
  }
}
